#pragma once
#include "Binding/BoundNode.hpp"
#include "Symbol/TypeSymbol.hpp"
#include "Syntax/Object/Object.hpp"
#include <memory>

class BoundExpression : public BoundNode
{
private:
    SharedTypeSymbol Type;

public:
    SharedTypeSymbol GetType() const { return this->Type; }

    virtual std::vector<std::tuple<std::string, std::string>> GetProperties() override { return {{"Type", this->Type->ToString()}}; }

protected:
    BoundExpression(BoundNodeKind kind, SharedTypeSymbol type) : BoundNode(kind), Type(type) {}
};

typedef std::shared_ptr<BoundExpression> SharedBoundExpression;